#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <semaphore.h>

int main()
{
	int eleccion = 0;
	int semafid = 0;
        int error;
        unsigned res;
        sem_t a;
	while (eleccion != 3) {
		printf("1. Conocer largo de la cola\n");
		printf("2. conocer el valor del semaforo (Si el semaforo no esta inicializado se devolvera 0)\n");
		printf("3. Salir\n");
		scanf("%d", &eleccion);
		switch (eleccion) {
			case 1:
				printf("Ingrese el numero de semaforo ");
                                scanf("%d", &semafid);
                                a.id=semafid;
                                error=sem_issem(&a);
                                if(error < 0){ 
                                   printf("error en issem (id no valido)");
                                   break;
                                }
                                if(error != 0){
                                   printf("error de asignacion del semaforo\n");
                                   break;
                                }
                                error=sem_assign(&a,0);
                                if(error < 0){
                                   printf("error al asignar semaforo\n");
                                   break;
                                }
                                error=sem_issem(&a);
                                if(error < 0){ 
                                   printf("error en issem (id no valido)");
                                   break;
                                }
                                if(error != 1){
                                   printf("error de asignacion del semaforo\n");
                                   break;
                                }
                                error=sem_getqueuesize(&a,&res);
                                if(error < 0){
                                   printf("error al pedir el largo de la cola del semaforo\n");
                                   break;
                                }
                                error=sem_issem(&a);
                                if(error < 0){ 
                                   printf("error en issem (id no valido)\n");
                                   break;
                                }
                                if(error != 1){
                                   printf("error de asignacion del semaforo\n");
                                   break;
                                }
                                printf("En la cola habia %d procesos \n",res);
                                error=sem_freesem(&a);
                                if(error < 0){
                                   printf("error al liberar semaforo\n");
                                   break;
                                }
                                error=sem_issem(&a);
                                if(error < 0){ 
                                   printf("error en issem (id no valido)\n");
                                   break;
                                }
                                if(error != 0){
                                   printf("error de asignacion del semaforo\n");
                                   break;
                                }
                                break;
			case 2:
				printf("Ingrese el numero de semaforo ");
                                scanf("%d", &semafid);
                                a.id=semafid;
                                error=sem_issem(&a);
                                if(error < 0){ 
                                   printf("error en issem (id no valido)\n");
                                   break;
                                }
                                if(error != 0){
                                   printf("error de asignacion del semaforo\n");
                                   break;
                                }
                                error=sem_assign(&a,0);
                                if(error < 0){
                                   printf("error al asignar semaforo\n");
                                   break;
                                }
                                error=sem_issem(&a);
                                if(error < 0){ 
                                   printf("error en issem (id no valido)\n");
                                   break;
                                }
                                if(error != 1){
                                   printf("error de asignacion del semaforo\n");
                                   break;
                                }
                                error=sem_getvalue(&a,&res);
                                if(error < 0){
                                   printf("error al pedir el valor del semaforo\n");
                                   break;
                                }
                                error=sem_issem(&a);
                                if(error < 0){ 
                                   printf("error en issem (id no valido)\n");
                                   break;
                                }
                                if(error != 1){
                                   printf("error de asignacion del semaforo\n");
                                   break;
                                }
                                printf("El valor era %d \n",res);
                                error=sem_freesem(&a);
                                if(error < 0){
                                   printf("error al liberar semaforo\n");
                                   break;
                                }
                                error=sem_issem(&a);
                                if(error < 0){ 
                                   printf("error en issem (id no valido)\n");
                                   break;
                                }
                                if(error != 0){
                                   printf("error de asignacion del semaforo\n");
                                   break;
                                }
                                break;
		}
	}
	return 0;
}
